package Day13;

public class Day13 {
    public static void main(String[] args) {


    //面试题
    //1 什么是字符串
    //2 存在哪里 存储在字符串常量池
    //3 什么是常量池 是在java中存储字符串的一块区域 (方法区 原空间)
    //它是由Java虚拟机自动管理的 目的是为了减少内存的使用 用来提高性能
    //4 字符串常量池特点 字符串常量池中每个字符串只有一份 可以被多个引用共享
    String str="abc";
    String str2="abc";
    //二者复用同一个引用
    //字符串常量池中的字符串是不可改变的 一旦创建不可改变
    //字符串常量池的字符串在编译器就确定了
    //字符串存储方式
    //1 字面量存储
    String string="abc";
    int i=10;
    //这些都是字面量
    //str.intern();//String字符串加入到常量池中
    String str3=new String("abc");
    String str4="abc";
        System.out.println(str3==str4);
        String str5=str3.intern();
        System.out.println(str5==str4);
        //intern()只能操作字符串常量池中的字符串 对堆中的字符串没有影响 因此输出为false
        System.out.println(str5==str3);

        //String str6=new String("abc");
        //创建了几个对象 两个 一个是字符串常量池中的字符串 一个是堆中的字符串
        //String str7=new String("abc")+"abc";
        /**对于 Java 代码片段 String str7 = new String("abc") + "abc";，执行过程中会生成 三个对象。具体分析如下：
        常量池中的第一个字符串对象： 字面量字符串 "abc" 在编译期间被发现时，如果常量池中尚不存在该字符串，则编译器会在常量池中创建一个 "abc" 对象。
        堆上的新 String 对象： new String("abc") 语句会创建一个新的 String 对象，其内容与常量池中的第一个 "abc" 相同，存储于 Java 堆上。
        字符串拼接产生的新对象： 当使用 + 运算符进行字符串连接时，Java 会创建一个新的 StringBuilder 实例（或在某些情况下可能使用 StringBuffer，但此处假设为 StringBuilder），并将左右两边的字符串添加到其中。对于 new String("abc") + "abc"，左边是一个堆上的 String 对象，右边是常量池中的另一个 "abc" 字符串对象。StringBuilder 将这两个字符串合并成一个新的字符串 "abcabc"，并调用其 toString() 方法得到最终的字符串结果。这个过程实质上是在堆上创建了第三个字符串对象。
        综上所述，执行 String str7 = new String("abc") + "abc"; 语句时，一共生成了 三个对象：
        常量池中的第一个字符串对象 "abc"。
        堆上的新 String 对象，其内容与常量池中的第一个字符串相同。
        通过字符串拼接操作在堆上生成的新字符串对象 "abcabc"。*/
        //创建了三个对象 一个是字符串常量池中的字符串 一个是堆中的字符串 一个是堆中的字符串
        //String str8=new String("a"+"c");
        //创建了两个对象 一个是字符串常量池中的字符串 一个是堆中的字符串

        //为什么要使用字符串常量池
        //1 节省内存空间
        //2 提高性能
        //如何判断字符串是否相等
        //equals()方法或者equalsIgnoreCase()方法

}
}